#ifndef HEAD_H
#define HEAD_H
#include <my_header.h>
//配置文件
typedef struct _conf{
	char host[20];
    char port[10];
    int worker_num;
}Conf;
//服务器目录前缀
#define HOME "/home/zgj/netdata"
//接收发送缓冲区的大小
#define BUF_SIZE 4096
//命令中最多有几个参数
#define MAX_WORDNUM 8
//命令中一个参数的最大长度
#define MAX_WORDLEN 30
#define MAXFILESIZE 104857600
//用户命令的状态码 
typedef enum{
    OP_ERR = -1,
    OP_SUC,
    OP_CD,
    OP_PWD,
    OP_LS,
    OP_MKDIR,
    OP_RMDIR,
    OP_PUTS,
    OP_GETS,
    OP_LOGIN,
}OP;

//定义一个套接字类型
typedef int socket_t;


//路径类型(二维数组版)
typedef struct {
    int c_argc;     //路径个数
    char _cmd[MAX_WORDNUM][MAX_WORDLEN];
}Cmd_t;

//传输文件协议TLV（小火车）
typedef struct{
    OP truck_op; //命令状态码
    int truck_len; //火车头，表示数据长度
    char truck_data[BUF_SIZE]; //火车厢，表示数据
}Truck_t;

void conf_get(char *path,Conf* conf);  //从配置文件中获取参数
socket_t tcp_init(char *ip,char* port); //返回一个正在监听的tcp类型的服务器套接字
void *child_handle(void *p); //子线程的具体工作
int download(int fd_socket,char *filename); //下载文件
int epoll_add(int fd,int epfd); //将fd加入到epfd
int epoll_del(int fd,int epfd); //将fd从epfd里删除
//void print_cmd(Cmd_t pcmd); //打印命令
int upload(int fd_socket, char *filename);//上传文件
int client_upload(int fd_socket, char *filename);//端点续传
int build_filepath(Cmd_t *pcmd, char *client_path, char *out, size_t size);
int send_truck(int fd,OP op,const char* data);
int update_current_dir(Cmd_t *pcmd, char *new_path);
int op_cd(int fd,Cmd_t* pcmd);
int op_pwd(int fd,Cmd_t* pcmd);
int op_ls(int fd,Cmd_t* pcmd);
int op_mkdir(int fd,Cmd_t* pcmd);
int op_rmdir(int fd,Cmd_t* pcmd);
int op_login(int fd);

#endif


